﻿using System;
using System.Collections;
using System.Collections.Generic;
using System.Data;
using l1cs.server.model.Instance;
using l1cs.server.templates;
using l1cs.server.utils;

namespace l1cs.server.datatables
{
    public class NpcChatTable
    {
        private static Logger _log = Logger.getLogger( typeof( NpcChatTable ).FullName );

        private static NpcChatTable _instance;

        private Dictionary<int, L1NpcChat> _npcChatAppearance = new Dictionary<int, L1NpcChat>();
        private Dictionary<int, L1NpcChat> _npcChatDead = new Dictionary<int, L1NpcChat>();
        private Dictionary<int, L1NpcChat> _npcChatHide = new Dictionary<int, L1NpcChat>();
        private Dictionary<int, L1NpcChat> _npcChatGameTime = new Dictionary<int, L1NpcChat>();

        public static NpcChatTable getInstance()
        {
            if ( _instance == null )
            {
                _instance = new NpcChatTable();
            }
            return _instance;
        }

        private NpcChatTable()
        {/*TTOK*/
            String sqlstr = "SELECT * FROM npcchat";
            using ( MySqlWrapper wrapper = new MySqlWrapper() )
            {
                foreach ( DataRow item in wrapper.GetDataTable( sqlstr ).Rows )
                {
                    L1NpcChat npcChat = new L1NpcChat();
                    npcChat.setNpcId( SqlUtils.toInt( item["npc_id"] ) );
                    npcChat.setChatTiming( SqlUtils.toInt( item["chat_timing"] ) );
                    npcChat.setStartDelayTime( SqlUtils.toInt( item["start_delay_time"] ) );
                    npcChat.setChatId1( Convert.ToString( item["chat_id1"] ) );
                    npcChat.setChatId2( Convert.ToString( item["chat_id2"] ) );
                    npcChat.setChatId3( Convert.ToString( item["chat_id3"] ) );
                    npcChat.setChatId4( Convert.ToString( item["chat_id4"] ) );
                    npcChat.setChatId5( Convert.ToString( item["chat_id5"] ) );
                    npcChat.setChatInterval( SqlUtils.toInt( item["chat_interval"] ) );
                    npcChat.setShout( Convert.ToBoolean( item["is_shout"] ) );
                    npcChat.setWorldChat( Convert.ToBoolean( item["is_world_chat"] ) );
                    npcChat.setRepeat( Convert.ToBoolean( item["is_repeat"] ) );
                    npcChat.setRepeatInterval( SqlUtils.toInt( item["repeat_interval"] ) );
                    npcChat.setGameTime( SqlUtils.toInt( item["game_time"] ) );

                    if ( npcChat.getChatTiming() == L1NpcInstance.CHAT_TIMING_APPEARANCE )
                    {
                        // 出現時のチャット登録
                        _npcChatAppearance[npcChat.getNpcId()] = npcChat;
                    }
                    else if ( npcChat.getChatTiming() == L1NpcInstance.CHAT_TIMING_DEAD )
                    {
                        // 死亡時のチャット登録
                        _npcChatDead[npcChat.getNpcId()] = npcChat;
                    }
                    else if ( npcChat.getChatTiming() == L1NpcInstance.CHAT_TIMING_HIDE )
                    {
                        // 空から降りてきた時のチャット登録
                        _npcChatHide[npcChat.getNpcId()] = npcChat;
                    }
                    else if ( npcChat.getChatTiming() == L1NpcInstance.CHAT_TIMING_GAME_TIME )
                    {
                        // ゲームタイムのチャット登録
                        _npcChatGameTime[npcChat.getNpcId()] = npcChat;
                    }
                }
            }
        }

        /// <summary>
        /// 出現時にチャットするものを返す。
        /// </summary>
        /// <param name="i">NPCID</param>
        /// <returns></returns>
        public L1NpcChat getTemplateAppearance( int i )
        {/*TTOK*/
            L1NpcChat ret;
            _npcChatAppearance.TryGetValue( i, out ret );
            return ret;
        }

        /// <summary>
        /// 死亡時にチャットするものを返す。
        /// </summary>
        /// <param name="i">NPCID</param>
        /// <returns></returns>
        public L1NpcChat getTemplateDead( int i )
        {/*TTOK*/
            L1NpcChat ret;
            _npcChatDead.TryGetValue( i, out ret );
            return ret;
        }

        /// <summary>
        /// 空から降りてきた時にチャットするものを返す。
        /// </summary>
        /// <param name="i">NPCID</param>
        /// <returns></returns>
        public L1NpcChat getTemplateHide( int i )
        {/*TTOK*/
            L1NpcChat ret;
            _npcChatHide.TryGetValue( i, out ret );
            return ret;
        }

        /// <summary>
        /// ゲームタイムでチャットするものを返す。
        /// </summary>
        /// <param name="i"></param>
        /// <returns></returns>
        public L1NpcChat getTemplateGameTime( int i )
        {/*TTOK*/
            L1NpcChat ret;
            _npcChatGameTime.TryGetValue( i, out ret );
            return ret;
        }

        /// <summary>
        /// ゲームタイムでチャットする全てのリストを返す。
        /// </summary>
        /// <returns></returns>
        public ICollection getAllGameTime()
        {
            //return _npcChatGameTime.values()
			//	.toArray(new L1NpcChat[_npcChatGameTime.size()]);
            return _npcChatGameTime.Values;
        }
    }
}
